home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / SCSI Samples 1.0 / SCSI Async Sample 06⁄15 ƒ / Src / NumericFilter.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-16  |  3.9 KB  |  179 lines  |  [TEXT/KAHL]

  1. /*
  2.  * Standard Dialog Filter
  3.  *    27-Aug-1991
  4.  */
  5. #include "SCSIAsyncSample.h"
  6. #include <Scrap.h>
  7.  
  8. pascal Boolean            NumericFilter(
  9.         DialogPtr            dp,
  10.         EventRecord            *eventPtr,
  11.         short                *itemHit
  12.     );
  13. /*
  14.  * Local
  15.  */
  16.  
  17. enum {
  18.     kReturnKey        = 13,
  19.     kEnterKey        = 3,
  20.     kEscapeKey        = 27,
  21.     kPushButton        = (ctrlItem + btnCtrl)
  22. };
  23.  
  24. /*
  25.  * Dialog support routines
  26.  *
  27.  * Replacement for the default ModalDialog procedure.  It does everything
  28.  * the default filter does, plus it draws a ring around the OK button.
  29.  * (Original by Mike Kahl).
  30.  *
  31.  * Adapted for SCSIAsyncSample to limit values to integers:
  32.  *        kQueryHostBus
  33.  *        kQueryTargetID
  34.  *        kQueryTotalRequests
  35.  *        kQueryBlocksPerTransfer
  36.  *        kQueryTimeout
  37.  */
  38. pascal Boolean
  39. NumericFilter(
  40.         DialogPtr            dp,
  41.         EventRecord            *eventPtr,
  42.         short                *itemHit
  43.     )
  44. {
  45.         GrafPtr            savePort;
  46.         Boolean            isFilteredEvent;
  47.         short            defaultItem;
  48.         unsigned char    key;
  49.         short            itemType;
  50.         Handle            itemHandle;
  51.         Rect            itemRect;
  52.         PenState        savePen;
  53.         short            theItem;
  54.         long            tempLong;        /* For delay        */        
  55. #define DIALOG    (* ((DialogPeek) dp))
  56.  
  57.         GetPort(&savePort);
  58.         isFilteredEvent = FALSE;
  59.         defaultItem = DIALOG.aDefItem;
  60.         /*
  61.          * Handle standard events
  62.          */
  63.         switch ((*eventPtr).what) {
  64.         case updateEvt:
  65.             if ((WindowPtr) (*eventPtr).message == (WindowPtr) dp) {
  66.                 if (defaultItem != 0) {
  67.                     GetDItem(
  68.                         dp,
  69.                         defaultItem,
  70.                         &itemType,
  71.                         &itemHandle,
  72.                         &itemRect
  73.                      );
  74.                     if ((itemType & ~itemDisable) == kPushButton) {
  75.                         SetPort(dp);
  76.                         GetPenState(&savePen);
  77.                         PenNormal();
  78.                         PenSize(3, 3);
  79.                         InsetRect(&itemRect, -4, -4);
  80.                         FrameRoundRect(&itemRect, 16, 16);
  81.                         SetPenState(&savePen);
  82.                         SetPort(savePort);
  83.                     }
  84.                 }
  85.             }
  86.             break;
  87.         case keyDown:
  88.         case autoKey:
  89.             key = (*eventPtr).message & charCodeMask;
  90.             if (key == kReturnKey
  91.              || key == kEnterKey
  92.              || key == kEscapeKey) {
  93.                  if (key == kEscapeKey)
  94.                      *itemHit = cancel;
  95.                  else {
  96.                     *itemHit = defaultItem;
  97.                 }
  98.                 GetDItem(
  99.                     dp,
  100.                     *itemHit,
  101.                     &itemType,
  102.                     &itemHandle,
  103.                     &itemRect
  104.                 );
  105.                 if ((itemType & itemDisable) == 0) {
  106.                     if (itemType == kPushButton) {
  107.                         HiliteControl((ControlHandle) itemHandle, inButton);
  108.                         Delay(8, &tempLong);
  109.                         HiliteControl((ControlHandle) itemHandle, 0);
  110.                     }
  111.                     isFilteredEvent = TRUE;
  112.                 }
  113.             }                                /* if return, enter, or escape    */
  114.             else if (((*eventPtr).modifiers & cmdKey) != 0
  115.                   && (key == 'x' || key == 'c' || key == 'v')) {
  116.                 /*
  117.                  * Do Cut, Copy, Paste in dialogs.
  118.                  */
  119.                 *itemHit = DIALOG.editField + 1;
  120.                 switch (key) {
  121.                 case 'c':                        /* Dialog copy            */
  122.                     DlgCopy(dp);
  123.                     *itemHit = 0;
  124.                     goto fixScrap;
  125.                 case 'x':                        /* Dialog cut            */
  126.                     DlgCut(dp);
  127. fixScrap:                ZeroScrap();
  128.                     TEToScrap();
  129.                     break;
  130.                 case 'v':
  131.                     DlgPaste(dp);                /* Umm, this will allow    */
  132.                     break;                        /* Pasting garbage!        */
  133.                 }
  134.                 if (*itemHit > 0) {
  135.                     GetDItem(
  136.                         dp,
  137.                         *itemHit,
  138.                         &itemType,
  139.                         &itemHandle,
  140.                         &itemRect
  141.                     );
  142.                     if ((itemType & itemDisable) == 0)
  143.                         isFilteredEvent = TRUE;
  144.                 }
  145.                 if (isFilteredEvent == FALSE)
  146.                     (*eventPtr).what = nullEvent;
  147.             }                                    /* If command key        */
  148.             else {                                /* Not a command key    */
  149.                 theItem = DIALOG.editField + 1;
  150.                 switch (theItem) {
  151.                 default:
  152.                     break;                        /* Uninteresting        */
  153.                 case kQueryHostBus:
  154.                 case kQueryTargetID:
  155.                 case kQueryTotalRequests:
  156.                 case kQueryBlocksPerTransfer:
  157.                 case kQueryTimeout:
  158.                     /*
  159.                      * Permit only 0..9 and delete.
  160.                      */
  161.                     if (key == '\b')            /* Delete                */
  162.                         ;
  163.                     else if (key < '0' || key > '9') {
  164. noGood:                    SysBeep(10);            /* Bogus                */
  165.                         isFilteredEvent = TRUE;
  166.                         (*eventPtr).what = nullEvent;
  167.                     }
  168.                     else {
  169.                         /* ok */
  170.                     }
  171.                     break;                        /* Numeric dialog items    */
  172.                 }                                /* Dialog item switch    */
  173.             }                                    /* Keystroke handler    */
  174.             break;
  175.         }
  176.         return (isFilteredEvent);
  177. }        
  178.  
  179.